import axios from "axios";
import { ElMessage } from "element-plus";
import { saveAs } from "file-saver";
import { useTokenStore } from "@/stores/token.js";
import router from "@/router";
import NProgress from "nprogress"; // 导入 NProgress
import "nprogress/nprogress.css"; // 导入 NProgress 样式

// 定义一个变量,记录公共的前缀  ,  baseURL
const baseURL = "/api";
const instance = axios.create({ baseURL });

// 添加请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 在请求头中添加token
    const tokenStore = useTokenStore();

    if (tokenStore.token) {
      config.headers.Authorization = tokenStore.token;
    }
    NProgress.start(); // 开始进度条
    return config;
  },
  // 请求错误的回调
  (err) => {
    NProgress.done(); // 结束进度条
    return Promise.reject(err);
  }
);

// 添加响应拦截器
instance.interceptors.response.use(
  (response) => {
    // 处理文件流
    if (
      response.headers["content-type"] ===
      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"
    ) {
      const disposition = response.headers["content-disposition"];
      const fileName = decodeURI(disposition.split("''")[1]);
      saveAs(response.data, fileName);
      NProgress.done(); // 结束进度条
      console.log("文件下载操作响应拦截器触发标记");
      return response.data;
    }

    // 处理 Blob 类型的响应
    if (response.config.responseType === 'blob') {
      NProgress.done(); // 结束进度条
      return response.data;
    }

    // 处理其他类型的响应
    if (response.data.code === 0) {
      NProgress.done(); // 结束进度条
      return response.data;
    }

    ElMessage.error(response.data.msg ? response.data.msg : "服务异常");
    NProgress.done(); // 结束进度条

    return Promise.reject(response.data);
  },
  (err) => {
    NProgress.done(); // 结束进度条
    // 当状态码显示401的时候，跳转到登录页面
    if (err.response && err.response.status === 401) {
      ElMessage.error("请先登录");
      router.push("/login");
    } else {
      ElMessage.error("服务异常");
    }

    return Promise.reject(err); // 异步的状态转化成失败的状态
  }
);

export default instance;